"""
面向对象包括2大主要特性:
1 封装
2 继承
3 多态
"""
"""
这里我们介绍  多态
多态,指的是: 多种状态,即完成某个行为时,使用不同的对象会得到不同的状态
"""


# 父类
class 类_动物:  # 抽象类
    def 叫声(self):
        pass  # 方法体是空实现(pass)称之为抽象方法


# 子类
class 类_狗(类_动物):
    def 叫声(self):  # 复写父类的 方法
        print("小狗在叫 汪汪汪")


# 子类
class 类_猫(类_动物):
    def 叫声(self):   # 复写父类的 方法
        print("大猫在叫 喵喵喵")


# --------------------------------------------
# 定义一个函数
def 噪音(噪音: 类_动物):  # 这里是注解是说用 父类传参
    噪音.叫声()  # 父类的方法,但是父类没有内容   真正的内容在子类
"""
特别说明: 
"噪声"是函数里的变量名, ".叫声"是 父类的 方法.
这个父类的方法 就是统一的行为, 下面传入子类的 对象 就是, 状态(具体执行的是 复写内容)
"""

# 定义对象
小狗 = 类_狗()
大猫 = 类_猫()

# 调用函数 我们把子类的对象 作为参数传入
噪音(大猫)  #  子类对象进行工作
噪音(小狗)
# 看输出结果,是子类的内容在工作
print()

"""
看上面的代码
函数(方法)形参说明接收 父类对象
实际传入父类的 子类对象进行工作

即:
以父类做定义声明
子类做实际工作
这样做 获得 同一个行为的,不同状态

这样理解 父类是行为   子类是状态
父类里 "方法" 这个行为.  子类里复写了 "方法".
 我们把对象,作为参数传入函数里.  父类就相当于模板, 子类同名的方法就是具体执行的内容
 这就相当于 父类是一个行为, 子类是多个状态
 父类提供一个标准, 子类具体干活
"""

"""
我们把上面的 父类 ,也称之为 抽象类

抽象类(接口)
这种设计的含义是:
父类用来确定有哪些方法
具体的方法的实现,由子类自行决定

这种写法.就叫做抽象类(也称之为接口)

抽象类:含有抽象方法的类称之为 抽象类
抽象方法:方法体是空实现(pass)称之为抽象方法


抽象类好比定义一个准备,包含一些 "抽象方法" 
要求子类自己实现
"""


# 父类 抽象类
class 类_空调:
    def 制冷(self):  # 抽象方法
        pass

    def 制热(self):
        pass

    def 左右摇摆(self):
        pass


# 子类  来实现父类方法
class 类_格力空调(类_空调):
    def 制冷(self):
        print("格力空调,制冷")

    def 制热(self):
        print("格力空调,制热")

    def 左右摇摆(self):
        print("格力空调,左右摇摆")


class 类_海尔空调(类_空调):
    def 制冷(self):
        print("海尔空调,制冷")

    def 制热(self):
        print("海尔空调,制热")

    def 左右摇摆(self):
        print("海尔空调,左右摇摆")


# 定义函数
def 制热(开关: 类_空调):  # 注解下 父类是 "类_空调"
    开关.制热()  # 父类的 抽象方法


# 对象
格力 = 类_格力空调()
海尔 = 类_海尔空调()

# 参数传入的是 子类的对象
制热(格力)
制热(海尔)
制热()
